// 遍历 DOM 树
// function walkDOM (n) {
//     do {
//         console.log(n);
//         if (n.hasChildNodes()) {
//             walkDOM(n.firstChild);
//         }
//     } while (n == n.nextSibling);
// }

// function removeAll(n) {
//     while (n.firstChild) {
//         n.removeChild(n.firstChild);
//     }
// }

// var obj1 = new Object();
// var obj2 = {};

// console.log(Object.getPrototypeOf(obj1) === Object.prototype);
// console.log(Object.getPrototypeOf(obj2) === Object.prototype);
// console.log(Object.getPrototypeOf(obj1));

// var obj = {
//     a: 1,
//     getA: function() {
//         console.log( this === obj);
//         console.log(this);
//     }
// };
// obj.getA();

var name = 'global';
var obj = {
    name: 'local',
    getName: function () {
        return this.name;
    }
};
var getName = obj.getName;
console.log(getName());

var obj1 = {
    name: 'obj1'
};
var obj2 = {
    name: 'obj2'
};
window.name = 'window';
var getName = function() {
    console.log(this.name);
};

getName();
getName.call(obj1);
getName.call(obj2);

(
    function() {
        Array.prototype.push.call(arguments, 3);
        console.log(arguments);
    }
)(1,2);

var a = {};
Array.prototype.push.call(a, 'first');

var func = function() {
    var a = 1;
    return function() {
        a++;
        console.log(a);
    }
}
var f = func();
f();

var Type = {};
for (var i = 0, type; type = ['String', 'Array', 'Number'][i++];) {
    (function(type) {
        Type['is'+type] = function(obj) {
            return Object.prototype.toString.call(obj) === '[object ' + type +']';    
        }
    })(type);
};
Type.isArray([]);
Type.isString('str');

var mult = (function(){
    var cache = {};
    var calculate = function () {
        var a = 1;
        for (var i = 0, l = arguments.length; i < l; i++) {
            a = a * arguments[i];
        }
        return a;
    };
    console.log('cache', cache);

    return function() {
        var args = Array.prototype.join.call(arguments, ',');
        if (args in cache) {
            return cache[args];
        }

        return cache[args] = calculate.apply(null, argumens);
    }
})();

let f = function() {
    this.a = 1;
    this.b = 2;
};

let o = new f();

function f({
    url,
    data = {},
    loading = false,
    title = '加载中...',
    header = {}} = {}) {
    console.log(url, data, loading, title, header);
}
let args = {
    url: '333',
    data: {
        a:1,
        b:2
    },
    loading: true
}